草庐IT

C++ STL : Custom sorting one vector based on contents of another

全部标签

c++ - STL 中的 VS 编译器错误 C2752 ("more than one partial specialization matches")

不知何故,我喜欢这些显示(基本?)问题的“最短”程序。在VS2008中测试一些模板代码时出现了这个错误(它也已在VS2010和VS2012中得到确认,见下文):c:\programfiles(x86)\microsoftvisualstudio9.0\vc\include\xmemory(225):errorC2752:'std::_Ptr_cat_helper':morethanonepartialspecializationmatchesthetemplateargumentlistwith[_T1=constfloat(**),_T2=constfloat(**)]我可以将问题归

c++ - STL - 赋值运算符与 `assign` 成员函数

vector(以及list和其他容器)有一个成员函数(MF)assign。我想比较assignMF(范围版本)与赋值运算符。据我所知,在以下情况下使用assign很有用:想要分配vector的子范围(不是从头到尾)。赋值是从一个数组完成的。在其他情况下,assignMF没有缺点,可以使用赋值运算符。我对吗?使用assignMF是否还有其他一些原因? 最佳答案 使用assign的主要原因就是将数据从一种容器复制到另一种容器。例如,如果您要迁移std::set的内容到std::vector,你不能使用赋值运算符,但你可以使用vector

c++ - 为什么 C++ STL 函数调用需要如此冗长?

为什么不能更简短地调用STL函数?我在cppreference.com上查看以下代码片段:#include#include#include#includeintmain(){std::strings("hello");std::transform(s.begin(),s.end(),s.begin(),[](unsignedcharc){returnstd::toupper(c);});std::cout在我看来,应该可以让这次通话更简短。第一件显而易见的事情是取消lambda:std::strings("hello");std::transform(s.begin(),s.end()

C++ STL 容器要求——后置条件混淆

我目前正在考虑实现一个自定义容器,它需要与STL算法兼容,因此必须满足所述的C++容器要求here.在该文档中,Methodsandoperators表指出,表达式a=b具有a==b的后置条件。我对此感到非常困惑。正如此表达式的表条目所述:destroysormove-assignsallelementsofafromelementsofb据我了解,移动对象的前提是被移动的对象(源对象?)将处于有效但未定义的状态。因此,在我看来,条件a==b是不能满足的。我在这里错过了什么? 最佳答案 cppreferencepage从可读性标准中

c++ - 如何将 STL 容器作为参数传递给 BOOST_CHECK_EQUAL?

例如,假设我们有一个要测试的类:structTestMe{vectorgetSomething();}测试函数由:...vectorExpected;TestMeTM;...Result=TM.getSomething();BOOST_CHECK_EQUAL(Result,Expected);...STLvector提供了一个免费的运算符==,但它没有提供运算符 最佳答案 我认为您应该使用BOOST_CHECK_EQUAL_COLLECTIONS,这会测试每个元素并打印不匹配的位置:BOOST_CHECK_EQUAL_COLLECT

c++ - C/C++ 中的 STL、iostream、new、delete for CUDA

我可以在C/C++中为CUDA使用STL、iostream、new、delete吗? 最佳答案 如果您有Fermi级GPU(因此计算能力>=2.0),并且正在使用CUDA4.0或更高版本,那么new和delete都可以使用在设备代码中。不支持STL容器和算法以及iostream。如果您想对CUDA使用“类似STL”的操作,您可能会对Thrust感兴趣模板库。它允许主机代码使用容器类型透明地与GPU交互,并实现许多非常有用的数据并行原语,如排序、缩减和扫描。请注意,这仍然是主机端设备,不能在您自己的内核代码中使用Thrust及其容器。

c++ - STL优先级队列和指针重载

这是我第一次使用优先队列。我正在尝试为学校实现Dijkstra算法,我认为我需要一个最小堆来执行此操作。现在我的节点是指针,我想比较它们的权重,但我认为我不能用指针重载>和到目前为止的代码:priority_queue,node_comparison>minHeap;然后我有一个结构来比较节点的权重structnode_comparison{booloperatortotalWeighttotalWeight;}};但是它说这个运算符函数的参数太多了。一段时间以来,我一直在尝试弄清楚如何用我的节点管理一个最小堆优先级队列,但一直卡住。有什么想法吗? 最佳答案

c++ - 如何强制清除 STL 内存缓存?

我有一个类,它有一个unordered_map类型的字段。我在我的应用程序中创建了该对象的单个实例,它被包装在shared_ptr中。该对象非常耗费内存,我想在使用完后立即将其删除。然而,重置指针只是释放了对象占用的一小部分内存。如何强制程序释放对象占用的所有内存?以下模拟程序重现了我的问题。for循环打印垃圾只是为了让我有足够的时间观察top使用的内存。析构函数在reset()之后被调用。此外,紧接着,使用的内存从大约2GB下降到1.5GB。#include#include#includeusingnamespacestd;structA{~A(){cerrindex;};intma

C++ 简洁地检查 STL 容器中的项目(例如 vector )

boolxInItems=std::find(items.begin(),items.end(),x)!=items.end();是否有更简洁的方法来检查x是否在项目中?这似乎不必要地冗长(重复项目三次),这使得代码的意图有点难以阅读。比如有没有类似下面的东西:boolxInItems=boost::contains(items,x);如果不存在任何更简洁的boost/STL算法来检查集合是否包含项目,那么使用辅助函数来启用contains(items,x)?我是否使用了错误的STL容器?即使是std::set也会导致boolxInItems=items.find(x)!=items.

c++ - std::map::begin() 之前的 STL 迭代器

在C++11的std::map中,是否有一些有效的迭代器x使得++x保证等于map::开始()?我想检测我刚刚调用的函数(我的)是否已经将迭代器从函数的前面移开。该函数会将迭代器恰好向后移动一个位置。答案是否适用于图书馆的其他人? 最佳答案 不,std容器中开始之前的迭代器都是UB(反向迭代器除外,它可能无法解决您的问题)。您可能需要修复有问题的函数。如果做不到这一点,请将其包装起来并在调用它之前捕获不良行为。如果做不到这一点,您可以在map键类型排序中插入一个负无穷大元素,并添加一个标记值。如果做不到这一点,您可以编写迭代器适配器